/*******************************************************************************
* Copyright (c) 2011 Frank Appel and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Frank Appel - initial API and implementation
******************************************************************************/
package com.codeaffine.example.rwt.osgi.ui.example.slides;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.Cookie;
import org.eclipse.rwt.lifecycle.WidgetUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import com.codeaffine.example.rwt.osgi.ui.platform.PageService;
import com.codeaffine.example.rwt.osgi.ui.platform.PageTracker;
import com.codeaffine.example.rwt.osgi.ui.platform.ServiceProvider;
import com.codeaffine.example.rwt.osgi.ui.platform.UIContributor;
public class MenuBar implements UIContributor {
private static final String PAGE_ID_COOKIE = "pageId";
public static final String MENU_BAR_CONTROL = MenuBar.class.getName() + "#MENUBAR";
// NOTE: this value reflects the height of the menubar_background image set via css
static final int MENU_BAR_HEIGHT = 41;
private static final String MENUBAR_BACKGROUND = "menubar_background";
private static final String MENU_BUTTON = "menu_button";
private final ServiceProvider serviceProvider;
final Map<String,Button> buttons;
public MenuBar( ServiceProvider serviceProvider ) {
this.serviceProvider = serviceProvider;
this.buttons = new HashMap<String,Button>();
}
@Override
public String getId() {
return MENU_BAR_CONTROL;
}
@Override
public Control contribute( Composite parent ) {
final Composite result = new Composite( parent, SWT.INHERIT_DEFAULT );
result.setData( WidgetUtil.CUSTOM_VARIANT, MENUBAR_BACKGROUND );
RowLayout layout = new RowLayout();
layout.marginTop = 8;
layout.marginLeft = 30;
result.setLayout( layout );
final PageService pageService = serviceProvider.get( PageService.class );
pageService.addPageTracker( new PageTracker() {
@Override
public void pageAdded( UIContributor page ) {
buttons.put( page.getId(), createMenuButton( result, pageService, page.getId() ) );
}
@Override
public void pageRemoved( UIContributor page ) {
Button removed = buttons.remove( page.getId() );
removed.dispose();
selectMenuBarButton();
}
} );
return result;
}
Button createMenuButton( Composite parent,
final PageService pageService,
final String pageId )
{
unselectButtons();
final Button result = new Button( parent, SWT.TOGGLE );
RowData data = new RowData();
data.height = 40;
result.setLayoutData( data );
result.setData( WidgetUtil.CUSTOM_VARIANT, MENU_BUTTON );
result.setText( pageId );
result.addSelectionListener( new SelectionAdapter() {
private static final long serialVersionUID = 1L;
@Override
public void widgetSelected( SelectionEvent evt ) {
unselectButtons();
pageService.selectPage( pageId );
result.setSelection( true );
updatePageToSelect( pageId );
}
} );
if( getPageToSelect().equals( pageId ) ) {
pageService.selectPage( pageId );
result.setSelection( true );
updatePageToSelect( pageId );
}
selectMenuBarButton();
parent.layout( true, true );
return result;
}
void selectMenuBarButton() {
Button toSelect = buttons.get( getPageToSelect() );
if( toSelect != null ) {
unselectButtons();
toSelect.setSelection( true );
}
}
void updatePageToSelect( String pageId ) {
CookieUtil.setCookie( PAGE_ID_COOKIE, pageId );
}
String getPageToSelect() {
Cookie cookie = CookieUtil.getCookie( PAGE_ID_COOKIE );
String result = SlidesUIContributor.ID;
if( cookie != null ) {
result = cookie.getValue();
}
return result;
}
void unselectButtons() {
Iterator<Button> iterator = buttons.values().iterator();
while( iterator.hasNext() ) {
iterator.next().setSelection( false );
}
}
}